package org.i0o.webplus.commons.util.populator.converters;

import java.lang.reflect.Array;
import java.util.Collection;

import org.i0o.webplus.commons.util.populator.IConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 基本转换器
 * 
 * @author <a href="mailto:781131@gmail.com">HTF</a>
 * @version 2010-5-26
 */
public abstract class BaseConverter
	implements IConverter {
	/**
	 * 用于记录日志的Log
	 */
	protected final Logger log = LoggerFactory.getLogger(this.getClass());

	/*
	 * (non-Javadoc)
	 * @see
	 * com.citinet.webplus.util.populator.IConverter#convert(java.lang.Object,
	 * java.lang.Class)
	 */
	@Override
	public final Object convert(Object value, Class<?> targetType, Object... configs) {
		if (value == null) {
			return null;
		} else {
			value = this.convertArray(value);
			/**
			 * 如果对象和目标类型相同，则直接返回
			 */
			if (targetType.isInstance(value)) {
				return value;
			}

			/**
			 * 不对Annotation, Interface, Enummeration类型进行转换。
			 */
			if (targetType == null || (value == null && !targetType.isPrimitive()) || targetType.isInterface() || targetType.isAnnotation()
					|| targetType.isEnum()) {
				return null;
			}

			if (targetType == String.class) {
				return convertToString(value);
			}

			return convertToType(value, targetType, configs);
		}

	}

	/**
	 * 转换数组，只取数组的第一个元素
	 * 
	 * @param value
	 *            原始值
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	private Object convertArray(Object value) {

		if (value.getClass().isArray()) {
			if (Array.getLength(value) > 0) {
				return Array.get(value, 0);
			} else {
				return null;
			}
		}

		if (value instanceof Collection) {
			Collection collection = (Collection) value;
			if (collection.size() > 0) {
				return collection.iterator().next();
			} else {
				return null;
			}
		}

		return value;
	}

	protected Class<?> primitive(Class<?> type) {
		if (Byte.TYPE.equals(type)) {
			return Byte.class;
		}
		if (Short.TYPE.equals(type)) {
			return Short.class;
		}
		if (Integer.TYPE.equals(type)) {
			return Integer.class;
		}
		if (Long.TYPE.equals(type)) {
			return Long.class;
		}
		if (Float.TYPE.equals(type)) {
			return Float.class;
		}
		if (Double.TYPE.equals(type)) {
			return Double.class;
		}
		return type;
	}

	/**
	 * 转换成字符串
	 * 
	 * @param value
	 * @return
	 */
	protected String convertToString(Object value) {
		return value.toString();
	}

	/**
	 * 执行具体转换器
	 * 
	 * @param value
	 *            原始值
	 * @param targetType
	 *            要转换的值
	 * @return 经过转换后的返回
	 */
	protected abstract Object convertToType(Object value, Class<?> targetType, Object... configs);

	/**
	 * 取回该转换器默认返回类型
	 * 
	 * @return 返回类型
	 */
	protected abstract Class<?> getDefaultType();

}
